﻿using System;
using System.Data;
using System.Text;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using GC2.Bussines;
using GC2.Bussines.BMAdmin;
using GC2.Entities.Admin;
using GC2.Entities.Seguridad;
using GC2.ExceptionHandler;

public partial class AdmRemitos : GenericPage
{
    #region Propiedades

    Usuarios usuario = new Usuarios();
    List<Talonarios> listaTalonarios = new List<Talonarios>();
    Talonarios talonario = new Talonarios();
    List<Impuestos> listaTasas = new List<Impuestos>();
    GC2.Funciones.General.FunctionsSite f = new GC2.Funciones.General.FunctionsSite();

    //protected List<RemitosDet> listaRemitosDet = new List<RemitosDet>();
    private List<RemitosDet> listaRemitosDet
    {
        get
        {
            return (List<RemitosDet>)Session["listaRemitosDet"];
        }
        set
        {
            Session["listaRemitosDet"] = value;
        }
    }

    #endregion

    #region Controles

    #region Page_Load
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            SetearCultura();
            SetearConexion();
            if (!IsPostBack)
            {
                usuario = (Usuarios)Session["UsuarioActual"];
                BMClientes bmClientes = new BMClientes(Connection);
                Clientes cliente = new Clientes();
                List<Clientes> listaClientes = new List<Clientes>();
                listaClientes = bmClientes.BMClientesSearch(cliente);
                Session["listaClientes"] = listaClientes;
                int iAccion = 1;
                if (Session["Accion"] != null)
                {
                    iAccion = Convert.ToInt16(Session["Accion"]);
                    if (Session["Remito"] == null)
                    {
                        iAccion = 1;
                    }
                }
                Session["Accion"] = iAccion;
                listaRemitosDet = new List<RemitosDet>();
                Session["listaRemitosDet"] = listaRemitosDet;
                CargarTalonarios();
                if (iAccion == 1) // Alta Remito
                {
                    Session["Remito"] = null;
                    NuevoRemito();
                    btnAnular.Visible = false;
                    btnImprimir.Visible = false;
                    btnFacturar.Visible = false;
                    FechaCambio.Visible = false;
                    trEstado.Visible = false;
                    txtCodBarra.Focus();
                }
                if (iAccion == 2)
                {
                    CargarRemito();
                    
                }
                if (iAccion == 3)
                {
                    CargarRemito();
                }
                
                // los siguientes atributos estan manejados de esta manera
                // porque asp.net a veces pierde los valores de los txtbox si la propiedad
                // ReadOnly = True en tiempo de diseño.
                txtIdArticulo.Attributes.Add("readonly", "readonly");
                txtArticulo.Attributes.Add("readonly", "readonly");
                txtStock.Attributes.Add("readonly", "readonly");
                txtLote.Attributes.Add("readonly", "readonly");
                txtCliente.Attributes.Add("readonly", "readonly");
                txtSaldo.Attributes.Add("readonly", "readonly");
                txtCodBarra.Attributes.Add("onkeydown", "if (event.keyCode==13) {event.keyCode=0; document.getElementById('" + btnCodBarra.ClientID + "').click();}");                
            }
            listaRemitosDet = (List<RemitosDet>)Session["listaRemitosDet"];            

        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region txtIdCliente_TextChanged
    protected void txtIdCliente_TextChanged(object sender, EventArgs e)
    {
        try
        {
            if (txtCliente.Text == "")
            {
                txtCliente.Text = "";
                txtIdCliente.Attributes.Add("readonly", "readonly");
                BuscarCliente();
            }            
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnBuscarCliente_Click
    protected void btnBuscarCliente_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtCodBarra.Text.Equals(""))
            {
                txtIdCliente.Text = "";
                txtCliente.Text = "";
                txtIdCliente.Attributes.Add("readonly", "readonly");
                BuscarCliente();
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnLimpiar_Click
    protected void btnLimpiar_Click(object sender, EventArgs e)
    {
        try
        {
            Limpiar();
            LimpiarItem();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnCancelar_Click
    protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Seguridad/Default.aspx", false);
        }
    #endregion

    #region btnImprimir_Click
    protected void btnImprimir_Click(object sender, EventArgs e)
    {
        Remitos remito = (Remitos)Session["remito"];
        Clientes cliente = new Clientes();
        cliente.Id_Cliente = remito.Id_Cliente;
        BMClientes bmClientes = new BMClientes(Connection);
        cliente = bmClientes.BMClientesGetOne(cliente);
        remito.Direccion = txtDireccion.Text;
        string sTemp = remito.Prefijo;
        sTemp += remito.Remito;
        remito.FFactura = sTemp;
        int iReporte = 0; 
        if (lblFormato.Text == "R")
        {
            string sMascara = Mascaras("R");
            if (sMascara == "")
            {
                lblMensaje.Text = "Falta formato de impresión tipo R, avise a soporte.";
                mpeMensaje.Show();
                return;
            }
            iReporte = 1;
        }
        if (lblFormato.Text == "X")
        {
            string sMascara = Mascaras("X");
            if (sMascara == "")
            {
                lblMensaje.Text = "Falta formato de impresión tipo X, avise a soporte.";
                mpeMensaje.Show();
                return;
            }
            iReporte = 2;
        }
       
        if (iReporte == 0)
        {
            lblMensaje.Text = "Formato de impresión no previsto, avise a soporte.";
            mpeMensaje.Show();
            return;
        }
        
        Session["iReporte"] = iReporte.ToString(); //  1 Remito R  -  2  Remito X 
        registrarScript();
    }
    #endregion

    #region btnGuardar_Click
    protected void btnGuardar_Click(object sender, EventArgs e)
    {
        try
        {
            int iAccion = Convert.ToInt16(Session["Accion"]);
            if (txtIdCliente.Text != "")
            {
                if (cboTalon.Items.Count > 0)
                {
                    listaRemitosDet = (List<RemitosDet>)Session["listaRemitosDet"];
                    if (listaRemitosDet.Count > 0)
                    {
                        if (iAccion == 1)
                        {
                            Guardar();
                            btnImprimir.Visible = true;
                        }
                    }
                    else
                    {
                        lblMensaje.Text = "No puede Guardar una Remito sin items.";
                        mpeMensaje.Show();
                    }
                }
                else
                {
                    lblMensaje.Text = "No hay Talonarios habilitados.";
                    mpeMensaje.Show();
                }
            }
            else
            {
                lblMensaje.Text = "Falta seleccionar Cliente.";
                mpeMensaje.Show();
            }

        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnNuevoRemito_Click
    protected void btnNuevoRemito_Click(object sender, EventArgs e)
    {
        try
        {
            NuevoRemito();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnBuscarArticulo_Click
    protected void btnBuscarArticulo_Click(object sender, EventArgs e)
    {
        try
        {
            BuscarArticulo();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region gvRemitosDet_PageIndexChanging
    protected void gvRemitosDet_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        try
        {
            gvRemitosDet.PageIndex = e.NewPageIndex;
            gridDataBaund();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region gvRemitosDet_RowDeleting
    protected void gvRemitosDet_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        try
        {
            RemitosDet ventasDet = new RemitosDet();
            ventasDet.Item = listaRemitosDet[e.RowIndex].Item;
            List<RemitosDet> listaTemp = listaRemitosDet;
            listaRemitosDet = new List<RemitosDet>();
            foreach (RemitosDet item in listaTemp)
            {
                if (item.Item != ventasDet.Item)
                {
                    listaRemitosDet.Add(item);
                }
            }
            Session["listaRemitosDet"] = listaRemitosDet;
            ActualizarGrilla();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region gvRemitosDet_RowDataBound
    protected void gvRemitosDet_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        try
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                List<RemitosDet> listaRemitosDet = (List<RemitosDet>)Session["listaRemitosDet"];
                if (listaRemitosDet[e.Row.RowIndex + (gvRemitosDet.PageIndex * 10)].FechaVto == FechaNula)
                {
                    Label label = (Label)e.Row.Cells[4].FindControl("FechaVto");
                    label.Text = "";
                }
                int iAccion = Convert.ToInt16(Session["Accion"]);
                if (iAccion != 1)
                {
                    e.Row.Cells[6].Visible = false;
                }
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnAgregar_Click
    protected void btnAgregar_Click(object sender, EventArgs e)
    {
        try
        {
            if (f.isNumeric(txtCantidad.Text))
            {
                Decimal dCantidad = Convert.ToDecimal(txtCantidad.Text);
                if (dCantidad > 0)
                {
                    if (f.isNumeric(txtIdArticulo.Text))
                    {
                        AgregarItem();
                    }
                    else
                    {
                        lblMensaje.Text = "Debe seleccionar Artículo.";
                        mpeMensaje.Show();
                    }
                }
                else
                {
                    lblMensaje.Text = "Debe informar Cantidad.";
                    mpeMensaje.Show();
                }
            }
            else
            {
                lblMensaje.Text = "Debe informar Cantidad.";
                mpeMensaje.Show();
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnAnular_Click
    protected void btnAnular_Click(object sender, EventArgs e)
    {
        try
        {
            Anular();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region btnCodBarra_Click
    protected void btnCodBarra_Click(object sender, EventArgs e)
    {        
        if (!txtCodBarra.Text.Equals(""))
        {
            //codigo de barras, ej.: 123 esta en la base
            AgregaCodigoBarras();
        }
    }
    #endregion

    #region cboTalon_SelectedIndexChanged
    protected void cboTalon_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            tdFactura1.Visible = true;
            tdFactura2.Visible = true;
            if (cboTalon.SelectedItem.Value != "0")
            {
                tdFactura1.Visible = true;
                tdFactura2.Visible = true;
                
                int iTalonario = Convert.ToInt16(cboTalon.SelectedItem.Value);

                listaTalonarios = (List<Talonarios>)Session["listaTalonarios"];
                foreach (Talonarios item in listaTalonarios)
                {
                    if (item.Id == iTalonario)
                    {
                        Session["talonario"] = item;
                        txtPrefijo.Text = item.Prefijo;
                        lblFormato.Text = item.Tipo;
                        Facturas factura = new Facturas();
                        // factura.Sucursal = item.Sucursal;
                        factura.Sucursal = 1;
                        factura.Talonario = item.Id;
                        BMFacturas bmFacturas = new BMFacturas(Connection);
                        txtRemito.Text = bmFacturas.FacturasProximoNumero(factura).ToString();
                        break;
                    }
                }
            }
            else
            {
                tdFactura1.Visible = false;
                tdFactura2.Visible = false;
            }
            txtCodBarra.Focus();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region txtFactura_TextChanged
    protected void txtFactura_TextChanged(object sender, EventArgs e)
    {
        {
            try
            {
                Int32 iNumero = Convert.ToInt32(txtRemito.Text.Trim());
            }
            catch (Exception ex) 
            {
                txtRemito.Text = "";
                lblMensaje.Text = ex.Message;
                mpeMensaje.Show();
                return;
            } 
            bool ok = ControlRemito();
            if (!ok)
            {
                txtRemito.Text = "";
            }
            else
            {
                txtRemito.ReadOnly = true;
                cboTalon.Enabled = false;
            }
            txtCodBarra.Focus();
        }
    }
    #endregion

    #region btnCobranza_Click
    protected void btnCobranza_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/Clientes/Cobranza.aspx", false);
    }
    #endregion

    #region btnFacturar_Click
    protected void btnFacturar_Click(object sender, EventArgs e)
    {
        try
        {
            // Factura en base al Remito
           
            Remitos remito = new Remitos();
            remito = (Remitos)Session["Remito"];
            listaRemitosDet = (List<RemitosDet>)Session["listaRemitosDet"];


            StringBuilder sb = new StringBuilder();
            sb.Append("Ventas.aspx");
            Session["Accion"] = 4;

            Response.Redirect(sb.ToString(), false);
        }
        catch (Exception ex) { throw ex; }
    }
    #endregion

    #endregion

    #region Métodos

    #region BuscarCliente
    public void BuscarCliente()
    {
        try
        {
            List<Clientes> listaClientes = new List<Clientes>();
            listaClientes = (List<Clientes>)Session["listaClientes"];
            Clientes cliente = new Clientes();
            if (txtIdCliente.Text.Trim() != "")
            {
                cliente.Id_Cliente = Convert.ToInt16(txtIdCliente.Text.Trim());
            }
            cliente.Nombre = txtCliente.Text.Trim();

            bool encontrado = false;
            foreach (Clientes item in listaClientes)
            {
                if (item.Id_Cliente == cliente.Id_Cliente)
                {
                    txtIdCliente.Text = item.Id_Cliente.ToString();
                    txtCliente.Text = item.Nombre;
                    txtSaldo.Text = item.Saldo.ToString();
                    encontrado = true;
                    break;
                }
                if (item.Nombre == cliente.Nombre)
                {
                    txtIdCliente.Text = item.Id_Cliente.ToString();
                    txtCliente.Text = item.Nombre;
                    txtSaldo.Text = item.Saldo.ToString();
                    txtDireccion.Text = item.Direccion;
                    encontrado = true;
                    break;
                }
            }

            if (!encontrado)
            {
                txtIdCliente.Text = "";
                txtCliente.Text = "";
                Session["Remitos"] = "Remitos";
                #region dispararPopUp(hacePostBack)

                string scriptSession = @"
            <script language=""javascript"" type=""text/javascript"">
            <!--
                function mostrarCliente()
                {
                    var stringURL = 'BuscarCliente.aspx?pStation=0';
                    var oINPUTS = document.getElementsByTagName (""INPUT"");
                    for(var a=0;a<oINPUTS.length; a++)
                    {
                        //Validaciones para cuando el control fue arrastrado a un PopUP (Sin MasterPage)

                        if(oINPUTS[a].getAttribute(""id"") == 'ct100_DefaultContent_txtIdConcepto')
                        {
                            //alert('U1a: &IdConcepto = ' + oINPUTS[a].getAttribute(""value""));
                            stringURL = stringURL + '&Id_Concepto=' + oINPUTS[a].getAttribute(""value"");
                        }
                        if(oINPUTS[a].getAttribute(""id"") == 'ct100_DefaultContent_txtConcepto')
                        {  
                            //alert('U2a: &Concepto = ' + oINPUTS[a].getAttribute(""value""));
                            stringURL = stringURL + '&Concepto=' + oINPUTS[a].getAttribute(""value"");
                        }
                        if(oINPUTS[a].getAttribute(""id"") == 'ct100_DefaultContent_txtDireccion')
                        {  
                            //alert('U2a: &Concepto = ' + oINPUTS[a].getAttribute(""value""));
                            stringURL = stringURL + '&Concepto=' + oINPUTS[a].getAttribute(""value"");
                        }
                    }
                    // alert(stringURL);
                    var newWin = window.open(stringURL, ""popup"", ""menubar=no, resizable=no, scrollbars=yes, height=450, width=550, left=100, top=100"");
                }
                mostrarCliente();
            //-->
            </script>
            ";

                Page.ClientScript.RegisterStartupScript(this.GetType(), "ScriptA", scriptSession);
                #endregion

            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region Guardar
    public void Guardar()
    {
        try
        {
            BMRemitos bmRemitos = new BMRemitos(Connection);
            Remitos remito = new Remitos();
            BMRemitosDet bmRemitosDet = new BMRemitosDet(Connection);

            // Validacion Remito
            if (cboTalon.SelectedItem.Value != "0")
            {
                try
                {
                    Int32 iNumero = Convert.ToInt32(txtRemito.Text.Trim());
                }
                catch (Exception ex)
                {
                    string error = ex.Message.ToString();
                    txtRemito.Text = "";
                    lblMensaje.Text = "El Numero de Remito es Incorrecto.";
                    mpeMensaje.Show();
                    return;
                }
                bool ok = ControlRemito();
                if (!ok)
                {
                    return;
                }
            }

            remito = bmRemitos.BMRemitosGetNext();
            txtIdRemito.Text = remito.Id_Remito.ToString();

            // datos para Cabecera de Remitos
            remito.Id_Cliente = Convert.ToInt16(txtIdCliente.Text.Trim());
            remito.Cliente = txtCliente.Text;
            remito.Direccion = txtDireccion.Text;
            Usuarios usuario = new Usuarios();
            usuario = (Usuarios)Session["UsuarioActual"];
            remito.Id_Usuario = usuario.Id_Usuario;
            if (txtRemito.Text != "")
            {
                remito.Prefijo = txtPrefijo.Text;
                remito.Remito = int.Parse(txtRemito.Text);
            }
            remito.Id_Estado = 1;
            remito.Estado = "Activo";
            remito.Fecha = Fecha.GetFecha();
            
            remito.Obs = txtObs.Text;
            remito.Tipo = lblFormato.Text;
           
            // Grabo Detalles
            List<RemitosDet> listaRemitosDet = new List<RemitosDet>();
            listaRemitosDet = (List<RemitosDet>)Session["listaRemitosDet"];
            int item = 0;
            foreach (RemitosDet remitoDet in listaRemitosDet)
            {
                if (remitoDet.Kilos > 0)
                {
                    item++;
                    remitoDet.Item = item;
                    remitoDet.Id_Remitos = remito.Id_Remito;
                    if (remitoDet.FechaVto != FechaNula)
                    {
                         remitoDet.FFechaVto = remitoDet.FechaVto.ToShortDateString();
                    }
                    if (remitoDet.Lote != "0")
                    {
                        remitoDet.FLote = remitoDet.Lote;
                    }
                    remito.Kilos += remitoDet.Kilos;
                    bmRemitosDet.BMRemitosDetInsert(remitoDet);

                    ActualizaStock(remitoDet);
                }
            }
            Session["listaRemitosDet"] = listaRemitosDet; // Datos actualizados para imprimir

            // Grabo Cabecera Remitos
            bmRemitos.BMRemitosInsert(remito);
            Session["remito"] = remito;

            // Grabo RemitoN
            if (remito.Remito > 0)
            {
                BMRemitoN bmRemitoN = new BMRemitoN(Connection);
                RemitoN remiton = new RemitoN();
                remiton.Id_Remito = int.Parse(remito.Id_Remito.ToString());
                remiton.Numero = remito.Remito;
                remiton.Prefijo = txtPrefijo.Text;
                remiton.Talonario = int.Parse(cboTalon.SelectedItem.Value);
                remiton.Nombre = cboTalon.SelectedItem.Text;

                bmRemitoN.RemitoNInsert(remiton);
            }
            lblAccion.Text = "Remito Guardado";

            btnNuevoRemito.Visible = true;

            btnLimpiar.Visible = false;
            btnGuardar.Visible = false;

        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region NuevoRemito
    public void NuevoRemito()
    {
        try
        {          
            DateTime dtHoy = DateTime.Now.Date;
            string sFecha = dtHoy.ToString().Remove(11);
            Fecha.SetFecha(Convert.ToDateTime(sFecha));

            btnNuevoRemito.Visible = false;
            btnLimpiar.Visible = true;
            btnGuardar.Visible = true;

            txtIdRemito.Text = "";
            txtIdCliente.Text = "";
            txtCliente.Text = "";
            txtSaldo.Text = "";
            txtRemito.ReadOnly = false;
            txtRemito.Text = "";
            Limpiar();
            txtSaldo.Text = "";
            txtDireccion.Text = "";
            lblAccion.Text = "Cargar Nuevo Remito";

            Session["Accion"] = 1;

            Session["listaTalonarios"] = null;
            cboTalon.Items.Clear();
            CargarTalonarios();
            if (cboTalon.Items.Count > 0)
            {
                int iTalonario = Convert.ToInt16(cboTalon.SelectedItem.Value);

                listaTalonarios = (List<Talonarios>)Session["listaTalonarios"];
                foreach (Talonarios item in listaTalonarios)
                {
                    if (item.Id == iTalonario)
                    {
                        Session["talonario"] = item;
                        txtPrefijo.Text = item.Prefijo;
                        lblFormato.Text = item.Tipo;
                        RemitoN remiton = new RemitoN();
                        //remiton.Sucursal = item.Sucursal;
                        remiton.Sucursal = 1;
                        remiton.Talonario = item.Id;
                        BMRemitoN bmRemitoN = new BMRemitoN(Connection);
                        txtRemito.Text = bmRemitoN.RemitoNProximoNumero(remiton).ToString();
                        break;
                    }
                }
            }
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region Limpiar
    public void Limpiar()
    {
        try
        {
            listaRemitosDet = new List<RemitosDet>();
            ActualizarGrilla();
            txtObs.Text = "";
            cboTalon.Enabled = true;
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion
   
    #region CargarRemito
    public void CargarRemito()
    {
        try
        {
            Remitos remito = new Remitos();
            remito = (Remitos)Session["Remito"];

            BMRemitos bmRemitos = new BMRemitos(Connection);
            List<Remitos> listaRemitos = new List<Remitos>();
            listaRemitos = bmRemitos.BMRemitosSearch(remito, remito);
            Session["Remito"] = listaRemitos[0];
            
            txtIdRemito.Text = listaRemitos[0].Id_Remito.ToString();
            Clientes cliente = new Clientes();
            BMClientes bmClientes = new BMClientes(Connection);
            cliente.Id_Cliente = listaRemitos[0].Id_Cliente;
            cliente = bmClientes.BMClientesGetOne(cliente);
            txtSaldo.Text = cliente.Saldo.ToString();
            txtIdCliente.Text = listaRemitos[0].Id_Cliente.ToString();
            txtCliente.Text = listaRemitos[0].Cliente;
            txtDireccion.Text = listaRemitos[0].Direccion;
            Fecha.SetFecha(listaRemitos[0].Fecha);
            
            txtObs.Text = listaRemitos[0].Obs;
            cboTalon.Enabled = false;

            tdFactura1.Visible = true;
            tdFactura2.Visible = true;
            cboTalon.Visible = false;
            //cboTalon.SelectedIndex = 1;;
            txtRemito.Text = listaRemitos[0].Remito.ToString();
            txtPrefijo.Text = listaRemitos[0].Prefijo;
            txtRemito.ReadOnly = true;
            lblFormato.Text = listaRemitos[0].Tipo;
            txtCondVenta.Text = listaRemitos[0].FCondVenta;
            txtOrdenC.Text = listaRemitos[0].FOrdenC;
            txtOrdenT.Text = listaRemitos[0].FOrdenT;

            BMRemitosDet bmRemitosDet = new BMRemitosDet(Connection);
            List<RemitosDet> listaRemitosDet = new List<RemitosDet>();
            RemitosDet remitoDet = new RemitosDet();
            remitoDet.Id_Remitos = listaRemitos[0].Id_Remito;

            listaRemitosDet = bmRemitosDet.BMRemitosDetGetAll(remitoDet);
            Session["listaRemitosDet"] = listaRemitosDet;

            ActualizarGrilla();

            lblAccion.Text = "Ver Remito - Boton Anular = anula Remito y revierte Stock";
            btnLimpiar.Visible = false;
            btnGuardar.Visible = false;
            btnNuevoRemito.Visible = false;
            btnBuscarCliente.Visible = false;
            btnBuscarArticulo.Visible = false;
            txtIdCliente.Attributes.Add("readonly", "readonly");
            btnAgregar.Enabled = false;
            Fecha.Attributes.Add("readonly", "readonly");
            txtObs.Attributes.Add("readonly", "readonly");
            if (listaRemitos[0].Id_Estado == 1)
            {
                FechaCambio.Visible = false;
                if (listaRemitos[0].Dias != "0")
                {
                    string sDias = listaRemitos[0].Dias;
                    sDias += " Dias";
                    txtDias.Text = sDias;
                }
            }
            else
            {
                btnAnular.Enabled = false;
                btnFacturar.Enabled = false;
                lblFechaCambio.Text = listaRemitos[0].Estado;
                FechaCambio.SetFecha(listaRemitos[0].FechaCambio);
                txtDias.Visible = false;
            }
            txtEstado.Text = listaRemitos[0].Estado;
            trArticulo1.Visible = false;
            trArticulo2.Visible = false;

            Session["Accion"] = null;
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region ActualizaStock
    protected void ActualizaStock(RemitosDet remitoDet)
    {
        try
        {
            // Graba Movimiento de Stock
            BMMovStock bmMov = new BMMovStock(Connection);
            MovStock mov = new MovStock();
            mov.Id_Rubro = remitoDet.Id_Rubro;
            mov.Id_SubRubro = remitoDet.Id_SubRubro;
            mov.Id_Articulo = remitoDet.Id_Articulo;
            mov.Lote = remitoDet.Lote;
            mov = bmMov.BMMovStockGetNext(mov);
            mov.ALote = 0;
            mov.Fecha = Fecha.GetFecha();
            mov.Rubro = remitoDet.Rubro;
            mov.SubRubro = remitoDet.SubRubro;
            mov.Articulo = remitoDet.Articulo;
            mov.Id_Operacion = Convert.ToInt16(txtIdRemito.Text.Trim());
            mov.Id_Usuario = remitoDet.Id_Usuario;
            mov.Kilos = remitoDet.Kilos;
            mov.Operacion = 5; // 1: Egreso - 2: Ingreso - 3: Compra - 4: Venta - 5: Remito
            mov.Saldo = remitoDet.Stock - remitoDet.Kilos;
            mov.Id_Usuario = remitoDet.Id_Usuario;
            bmMov.BMMovStockInsert(mov);

            // Actualiza Saldo Stock
            BMStock bmStock = new BMStock(Connection);
            Stock stock = new Stock();
            stock.Id_Rubro = remitoDet.Id_Rubro;
            stock.Rubro = remitoDet.Rubro;
            stock.Id_SubRubro = remitoDet.Id_SubRubro;
            stock.SubRubro = remitoDet.SubRubro;
            stock.Id_Articulo = remitoDet.Id_Articulo;
            stock.Lote = remitoDet.Lote;
            stock = bmStock.BMStockGetOne(stock);
            Decimal dStock = stock.Saldo;
            stock.Saldo = dStock - remitoDet.Kilos;
            bmStock.BMStockUpdate(stock);

            // Actualiza Saldo Lote
            if (stock.UsaLotes == 1)
            {
                BMLotes bmLotes = new BMLotes(Connection);
                VentasDet ventasDet = new VentasDet();
                ventasDet.Id_Articulo = remitoDet.Id_Articulo;
                ventasDet.Id_Rubro = remitoDet.Id_Rubro;
                ventasDet.Id_SubRubro = remitoDet.Id_SubRubro;
                ventasDet.Kilos = remitoDet.Kilos;
                ventasDet.Lote = remitoDet.Lote;

                bmLotes.BMLotesUpdateSaldo(ventasDet);
            }

            bmMov = null;
            mov = null;
            bmStock = null;
            stock = null;            
                
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region BuscarArticulo
    public void BuscarArticulo()
    {
        try
        {
            #region dispararPopUp(hacePostBack)
            Session["Estado"] = 1; // Para que devuelva solo articulos Activos
            string scriptSession = @"
            <script language=""javascript"" type=""text/javascript"">
                function mostrarArticulo()
                {
                    var stringURL = 'BuscarArticulo.aspx?pStation=0';
                    // alert(stringURL);
                    var newWin = window.open(stringURL, ""popup"", ""menubar=no, resizable=no, scrollbars=yes, height=500, width=650, left=100, top=100"");
                }
                mostrarArticulo();
            </script>
            ";

            Page.ClientScript.RegisterStartupScript(this.GetType(), "ScriptA", scriptSession);
            #endregion
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region gridDataBaund
    protected void gridDataBaund()
    {
        try
        {
            gvRemitosDet.DataSource = listaRemitosDet;
            gvRemitosDet.DataBind();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region LimpiarItem
    protected void LimpiarItem()
    {
        try
        {
            txtRubro.Value = "";
            txtSubRubro.Value = "";
            txtIdArticulo.Text = "";
            txtArticulo.Text = "";
            txtCodBarra.Text = "";
            txtStock.Text = "";
            txtCantidad.Text = "";
            txtLote.Text = "";
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region ActualizarGrilla
    protected void ActualizarGrilla()
    {
        try
        {
            Session["listaRemitosDet"] = listaRemitosDet;
            gridDataBaund();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region AgregarItem
    protected void AgregarItem()
    {
        try
        {
            // Hidrata nuevo item y agregar a la lista de items
            SubRubros subRubro = (SubRubros)Session["subRubro"];
            RemitosDet nuevoItem = new RemitosDet();
            nuevoItem.Articulo = txtArticulo.Text;
            nuevoItem.Id_Articulo = Convert.ToInt16(txtIdArticulo.Text);

            nuevoItem.Id_Rubro = subRubro.Id_Rubro;
            nuevoItem.Rubro = subRubro.Rubro;
            nuevoItem.Id_SubRubro = subRubro.Id_SubRubro;
            nuevoItem.SubRubro = subRubro.SubRubro;

            //nuevoItem.Id_Remitos = Convert.ToInt64(txtIdRemito.Text);     se actualizara al Grabar
            listaRemitosDet = (List<RemitosDet>)Session["listaRemitosDet"];
            int iItems = listaRemitosDet.Count;
            iItems++;
            nuevoItem.Item = iItems;
            nuevoItem.Kilos = Convert.ToDecimal(txtCantidad.Text);
            nuevoItem.Lote = txtLote.Text;
            if (nuevoItem.Lote != "0")
            {
                Lotes lote = new Lotes();
                lote.Id_Rubro = nuevoItem.Id_Rubro;
                lote.Id_SubRubro = nuevoItem.Id_SubRubro;
                lote.Id_Articulo = nuevoItem.Id_Articulo;
                lote.Lote = nuevoItem.Lote;
                BMLotes bmLote = new BMLotes(Connection);
                lote = bmLote.BMLotesGetOne(lote);
                if (lote.FechaVto > FechaNula)
                {
                    nuevoItem.FechaVto = lote.FechaVto;
                }
            }
            Decimal dStock = Convert.ToDecimal(txtStock.Text);
            nuevoItem.Stock = dStock - nuevoItem.Kilos;
            
          
            listaRemitosDet.Add(nuevoItem);
            Session["listaRemitosDet"] = listaRemitosDet;

            LimpiarItem();

            ActualizarGrilla();

            cboTalon.Enabled = false;
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region Anular
    public void Anular()
    {
        try
        {
            // Anula Remito y revierte saldos de stock 
            BMRemitos bmRemitos = new BMRemitos(Connection);
            Remitos remito = new Remitos();
            remito = (Remitos)Session["Remito"];
            remito.Obs = "Anulado: " + DateTime.Now.ToString();
            remito.Id_Estado = 2;
            remito.Estado = "Anulado";
            bmRemitos.BMRemitosUpdate(remito);

            
            listaRemitosDet = (List<RemitosDet>)Session["listaRemitosDet"];
            foreach (RemitosDet item in listaRemitosDet)
            {
                if (item.Kilos > 0)
                {
                    item.Kilos = item.Kilos * (-1);
                    ActualizaStock(item);
                }
            }

            lblAccion.Text = "Remito Anulado";
        }
        catch (Exception ex) { throw ex; }
    }
    #endregion

    #region CargarTalonarios
    protected void CargarTalonarios()
    {
        try
        {
            cboTalon.Enabled = true;
            
            listaTalonarios = new List<Talonarios>();
            if (Session["listaTalonarios"] != null)
            {
                listaTalonarios = (List<Talonarios>)Session["listaTalonarios"];
            }
            else
            {
                BMTalonarios bmTalonarios = new BMTalonarios(Connection);
                listaTalonarios = bmTalonarios.BMTalonariosGetAll();
                Session["listaTalonarios"] = listaTalonarios;
            }

            foreach (Talonarios itemTalonario in listaTalonarios)
            {
                if (itemTalonario.Habilitado)
                {
                    if (itemTalonario.Id > 200)
                    {
                        ListItem liItem = new ListItem();
                        liItem.Value = itemTalonario.Id.ToString();
                        liItem.Text = itemTalonario.Nombre;
                        cboTalon.Items.Add(liItem);
                    }
                    
                }
            }            
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region ControlRemito
    protected bool ControlRemito()
    {
        bool bRemito = true;
        try
        {
            Talonarios talonario = (Talonarios)Session["talonario"];
            Int32 iNumero = Convert.ToInt32(txtRemito.Text.Trim());

            if (iNumero > talonario.A)
            {
                lblMensaje.Text = "Numero de Remito fuera del Rango del Talonario.";
                bRemito = false;
            }
            if (iNumero < talonario.De)
            {
                lblMensaje.Text = "Numero de Remito fuera del Rango del Talonario.";
                bRemito = false;
            }
            if (!bRemito)
            {
                mpeMensaje.Show();
                return bRemito;
            }
            BMRemitoN bmRemitoN = new BMRemitoN(Connection);
            RemitoN pRemito = new RemitoN();
            RemitoN remiton = new RemitoN();
            pRemito.Numero = iNumero;
            remiton = bmRemitoN.RemitoNGetOne(pRemito);
            if (remiton.Numero == iNumero)
            {
                StringBuilder sb = new StringBuilder();

                sb.Append("Remito ya cargado en operación: ");
                sb.Append(remiton.Id_Remito.ToString());
                lblMensaje.Text = sb.ToString();

                bRemito = false;
                mpeMensaje.Show();
                return bRemito;
            }

            // Control de secuencia
            if (talonario.Control)
            {
                if (iNumero > talonario.De)
                {
                    pRemito.Numero = iNumero - 1;
                    remiton = new RemitoN();
                    remiton = bmRemitoN.RemitoNGetOne(pRemito);
                    if (remiton.Numero != pRemito.Numero)
                    {
                        lblMensaje.Text = "Remito anterior NO cargado.";
                        bRemito = false;
                    }
                }
            }

            if (!bRemito)
            {
                mpeMensaje.Show();
                return bRemito;
            }

            return bRemito;
        }
        catch (Exception ex) { ErrorUI(ex); }
        return bRemito;
    }
    #endregion

    #region AgregaCodigoBarras
    protected void AgregaCodigoBarras()
    {
        try
        {
            //codigo de barras, ej.: 123456 esta en la base con lote 7  ej 1234567 ( tiene lagroLote 6 )
            List<Stock> listaStock = new List<Stock>();
            BMStock bmStock = new BMStock(Connection);
            Stock stock = new Stock();
            Lotes lote = new Lotes();
            List<Lotes> listaLotes = new List<Lotes>();

            // Separar codigo de barra del numero de lote ( se toma como minimo 6 caracteres para articulo)
            string sArticulo = "";
            if (txtCodBarra.Text.Trim().Length > 5)
            {
                if (txtCodBarra.Text.Trim().Length > 6)
                {
                    sArticulo = txtCodBarra.Text.Trim().Remove(6);
                }
                else
                {
                    sArticulo = txtCodBarra.Text.Trim();
                }
            }
            else
            {
                lblMensaje.Text = "Error en Cod. de Barras ( el mínimo es de 6 caracteres)";
                mpeMensaje.Show();
                return;
            }

            stock.CodigoBarra = sArticulo;
            listaStock = bmStock.BMStockSearchCodBarr(stock);
            if (listaStock.Count == 1)
            {
                stock = listaStock[0];

                if (stock.UsaLotes == 1)
                {
                    lote.Id_Rubro = stock.Id_Rubro;
                    lote.Id_SubRubro = stock.Id_SubRubro;
                    lote.Id_Articulo = stock.Id_Articulo;
                    lote.Lote = txtCodBarra.Text.Trim().Remove(0, stock.LargoArt);
                    lote.Estado = 1;
                    BMLotes bmLotes = new BMLotes(Connection);
                    listaLotes = bmLotes.BMLotesSearch(lote);
                    if (listaLotes.Count == 0)
                    {
                        lblMensaje.Text = "Lote No disponible.";
                        mpeMensaje.Show();
                        return;
                    }
                    if (listaLotes.Count == 1)
                    {
                        txtLote.Text = listaLotes[0].Lote.ToString();
                        listaStock = bmStock.BMStockSearch(stock);
                        if (listaStock.Count > 0)
                        {
                            // valida lote
                            if (stock.Lote != "0")
                            {
                                lote = new Lotes();
                                lote.Id_Rubro = listaStock[0].Id_Rubro;
                                lote.Id_SubRubro = listaStock[0].Id_SubRubro;
                                lote.Id_Articulo = listaStock[0].Id_Articulo;
                                lote.Lote = stock.Lote;
                                bmLotes = new BMLotes(Connection);
                                lote = bmLotes.BMLotesGetOne(lote);
                                if (lote.Id_Articulo == 0)
                                {
                                    lblMensaje.Text = "Lote Inexistente.";
                                    mpeMensaje.Show();
                                    return;
                                }
                                if (lote.Estado == 0)
                                {
                                    lblMensaje.Text = "Lote Cerrado.";
                                    mpeMensaje.Show();
                                    return;
                                }
                            }
                        }
                    }
                }

                txtRubro.Value = listaStock[0].Id_Rubro.ToString();
                txtSubRubro.Value = listaStock[0].Id_SubRubro.ToString();
                txtIdArticulo.Text = listaStock[0].Id_Articulo.ToString();
                txtArticulo.Text = listaStock[0].Articulo;
                txtStock.Text = listaStock[0].Saldo.ToString();
                //txtPrecio.Text = listaStock[0].Precio.ToString().Replace(".", ",");
               
                txtCantidad.Text = txtCantBarra.Text;
               
                SubRubros subRubo = new SubRubros();
                subRubo.Id_Rubro = listaStock[0].Id_Rubro;
                subRubo.Rubro = listaStock[0].Rubro;
                subRubo.Id_SubRubro = listaStock[0].Id_SubRubro;
                subRubo.SubRubro = listaStock[0].SubRubro;
                Session["subRubro"] = subRubo;

                AgregarItem();
            }
            else
            {
                lblMensaje.Text = "Hay mas de una posibilidad de elección: deberá Buscar Artículo.";
                mpeMensaje.Show();
            }

            listaStock = null;
            bmStock = null;
            stock = null;
            txtCodBarra.Focus();


            ////codigo de barras, ej.: 123 esta en la base
            //List<Stock> listaStock = new List<Stock>();
            //BMStock bmStock = new BMStock(Connection);
            //Stock stock = new Stock();

            //// Separar codigo de barra del numero de lote
            //char[] separador = { '-' };
            //string[] completo = txtCodBarra.Text.Trim().Split(separador);
            //string codigo = completo[0];
            //string slote = "";
            //if (completo.Length > 1)
            //{ 
            //    slote = completo[1];
            //}
            //if (slote != "")
            //{
            //    stock.Lote = Convert.ToInt64(slote);
            //}
            //txtLote.Text = stock.Lote.ToString();
            //stock.CodigoBarra = codigo;
            //listaStock = bmStock.BMStockSearch(stock);
            //if (listaStock.Count > 0)
            //{
            //    // valida lote
            //    if (stock.Lote > 0)
            //    {
            //        Lotes lote = new Lotes();
            //        lote.Id_Rubro = listaStock[0].Id_Rubro;
            //        lote.Id_SubRubro = listaStock[0].Id_SubRubro;
            //        lote.Id_Articulo = listaStock[0].Id_Articulo;
            //        lote.Lote = stock.Lote;
            //        BMLotes bmLotes = new BMLotes(Connection);
            //        lote = bmLotes.BMLotesGetOne(lote);
            //        if (lote.Id_Articulo == 0)
            //        {
            //            lblMensaje.Text = "Lote Inexistente.";
            //            mpeMensaje.Show();
            //            return;
            //        }
            //        if (lote.Estado == 0)
            //        {
            //            lblMensaje.Text = "Lote Cerrado.";
            //            mpeMensaje.Show();
            //            return;
            //        }
            //    }

            //    txtRubro.Value = listaStock[0].Id_Rubro.ToString();
            //    txtSubRubro.Value = listaStock[0].Id_SubRubro.ToString();
            //    txtIdArticulo.Text = listaStock[0].Id_Articulo.ToString();
            //    txtArticulo.Text = listaStock[0].Articulo;
            //    txtStock.Text = listaStock[0].Saldo.ToString();
            //    //txtPrecio.Text = listaStock[0].Precio.ToString().Replace(".", ",");
            //    // txtPrecio.Text = listaStock[0].Precio.ToString();
            //    txtCantidad.Text = txtCantBarra.Text;
            //    if (txtCantidad.Text != "")
            //    {
            //        Decimal dCantidad = Convert.ToDecimal(txtCantidad.Text);
            //        if (dCantidad > 0)
            //        {
                        
            //        }
            //        else
            //        {
            //            lblMensaje.Text = "Debe informar Cantidad.";
            //            mpeMensaje.Show();
            //        }
            //    }
            //    else
            //    {
            //        lblMensaje.Text = "Debe informar Cantidad";
            //        mpeMensaje.Show();
            //    }

            //    SubRubros subRubo = new SubRubros();
            //    subRubo.Id_Rubro = listaStock[0].Id_Rubro;
            //    subRubo.Rubro = listaStock[0].Rubro;
            //    subRubo.Id_SubRubro = listaStock[0].Id_SubRubro;
            //    subRubo.SubRubro = listaStock[0].SubRubro;
            //    Session["subRubro"] = subRubo;

            //    AgregarItem();
            //}
            //else
            //{
            //    lblMensaje.Text = "Códido de Barras Inexistente";
            //    mpeMensaje.Show();
            //}

            //listaStock = null;
            //bmStock = null;
            //stock = null;
            //txtCodBarra.Focus();
        }
        catch (Exception ex) { ErrorUI(ex); }
    }
    #endregion

    #region registrarScript
    protected void registrarScript()
    {
        // dispararPopUp(hacePostBack)
        StringBuilder scriptSession = new StringBuilder("<script language='javascript' type='text/javascript'>");
        scriptSession.Append("function mostrarReporte()");
        scriptSession.Append("{");
        scriptSession.Append("var stringURL = '../Informes/Remito.aspx';");
        scriptSession.Append("var opciones='toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes';");
        scriptSession.Append("var newWin = window.open(stringURL, 'PopUp" + DateTime.Now.Ticks.ToString() + "', opciones);");
        scriptSession.Append("}");
        scriptSession.Append("mostrarReporte();");
        scriptSession.Append("</script>");

        Page.ClientScript.RegisterStartupScript(this.GetType(), "Reporte" + Session["iReporte"].ToString(), scriptSession.ToString());
    }
    #endregion

    #endregion 
}
